//
//  "$Id: Mobile.h 47856 2012-01-13 05:08:16Z zhou_mingwei $"
//
//  Copyright (c)1992-2007, ZheJiang Dahua Technology Stock CO.LTD.
//  All Rights Reserved.
//
//	Description:	3G接口 API
//	Revisions:		2011-10-17  huang_zhendi  Create
//

#ifndef __MOBILE_API_H__
#define __MOBILE_API_H__

#include "Defs.h"

#ifdef __cplusplus
extern "C" {
#endif

//
//				           宏定义
//
//----------------命令错误返回值编号-------------------//
//普通错误
#define INDEX_INVAIL        -1    //设备编号无效
#define DEV_UNEXIST         -2    // 3G模块不存在

#define VERSION_INVAIL      -4    // 配置文件版本号无效
#define GET_DEV_ERROR       -5    // 获取3G模块信息失败
#define SEND_SMS_FULL       -6    // 短信发送列队满
#define RECV_SMS_EMPTY      -7    // 没有有效的短信
#define CALLER_EMPTY        -8    // 没有来电
#define INVAIL_REP          -9    // 无效响应 
#define DEV_POWER_ON        -10   // 设备已经启动
#define DEV_CLOSING         -11   // 设备关闭中
#define PPP_OPENED          -12   // PPP链接已经打开  
#define DEV_INITING         -13   // 设备还在初始化中，未进入工作模式

#define PARAM_INAIL         -15   // 无效参数
#define FAIL_GET_STATE      -16   // 打开3G模块后，无法获取模块状态

#define FAIL_OPEN_CONFIG    -18   // 打开配置失败
#define FAIL_CREATE_CONFIG  -19   // 创建配置文件失败
#define SAVE_CONFIG_FAIL    -20   // 保存配置信息到配置文件时失败
#define PPP_UNCLOSED        -21   // 发送PPP关闭命令后，PPP链接未正常关闭

//致命错误，表示应用程序与3G程序无法通信,或出现异常返回值，需要重新打开设备和初始化3G接口库
#define FATAL_ERROR         -100  // 致命错误，大于该编号的错误均为异常
#define CMD_SEND_FAIL       -101  // 命令发送失败
#define CMD_RECV_FAIL       -102  // 命令发送失败
#define API_UNINIT          -103  // 3G接口库未初始化
#define CREATE_SOCK_FAIL    -104  // 创建socket失败
#define FAIL_START          -105  // 打开3G模块后，无法正常启动

#define CALLER_LEN          256     		//来电号码最大长度
#define MSG_LEN             256         //短信内容缓存大小
#define NUMBER_LEN	        16          //短信号码缓存大小 
#define DEV_NAME_LEN        32          //网络设备名长度

//
//				           结构体定义
//
/// 接口信息，256字节
typedef struct MobileInterfaceInfo
{
	int index;                      ///< 模块编号
	char name[DEV_NAME_LEN];        ///< 网络设备名
	char info[64];                  ///< 描述信息
	unsigned int typeMask;          ///< 支持的网络类型掩码，按位表示，每一位对应MobileType类型
	int reserved[38]; 				///< 保留字节，用于扩展
} MobileInterfaceInfo;

/// 3G模块模式类型
typedef enum MobileType
{
	MOBILE_TYPE_NOSERVICE = 0,
	MOBILE_TYPE_AMPS = 1,
	MOBILE_TYPE_CDMA_1X = 2,
	MOBILE_TYPE_EDGE = 3,
	MOBILE_TYPE_EVDO = 4,
	MOBILE_TYPE_WCDMA = 5,
	MOBILES_TYPE_GPRS = 6,
	MOBILE_TYPE_AUTOSEL = 7,
	MOBILE_TYPE_TD_SCDMA = 8,
	MOBILE_TYPE_TD_LTE = 9,
	MOBILE_TYPE_MAX_NUM
} MobileType;

/// 3G模块状态类型
typedef enum MobileModuleState
{
	POWER_OFF,       //target_state: 表示模块不需要启动
	                 //curr_state: 表示当前模块线程未启动，当target_state不为POWER_OFF时，说明模块需要被启动
	POWER_ON,        //target_state: 表示模块启动后不需要创建PPP链接
	                 //curr_state: 表示当前模块正在被启动
	DEV_REDAY,       //target_state: 无该状态
	                 //curr_state: 模块已经启动，可以向模块发送命令
	DEV_WORKING,     //target_state: 无该状态
	                 //curr_state: 模块已经处于正常工作状态
	PPP_ON,          //target_state: 表示模块启动后需要创建PPP链接
	                 //curr_state: 无该状态，ppp状态有WIRELESS_PPP_STATUS中的变量表示
} MobileModuleState;

/// 拨号鉴权类型
typedef enum PPPAuthType
{
	PAP = 0,
	CHAP,
	NO_AUTH,
	PAP_OR_CHAP
} PPPAuthType;

/// 3G模块配置信息，512字节
typedef struct MobilePPPConfig
{
	char apn[32];					///< 3G网络名
	char dail_num[32];				///< ppp拨号号码
	char user_name[128];			///< 3G上网用户名
	char user_pwd[128];				///< 3G上网密码
	int mtu;						///< mtu值
	PPPAuthType auth;				///< 拨号鉴权模式
	int reserved[46]; 				///< 保留字节，用于扩展
} MobilePPPConfig;

/// 3G模块状态类型
typedef enum MobileSIMState
{
	MOBILE_SIM_UNKNOW,				///< 状态未知
	MOBILE_SIM_UNEXIST,				///< 不存在
	MOBILE_SIM_EXIST,				///< 存在
} MobileSIMState;

typedef enum MobileSIMOperator
{
	MOBILE_SIM_CHINA_UNICOM,				///< 中国联通
	MOBILE_SIM_CHINA_TELECOM,				///< 中国电信
	MOBILE_SIM_CHINA_MOBILE,				///< 中国移动
	MOBILE_SIM_OPERATOR_UNKNOW,				///< 未知运营商
} MobileSIMOperator;

/// PPP链接状态类型
typedef enum MobilePPPState
{
	MOBILE_PPP_DOWN,				///< 未开启链接
	MOBILE_PPPD_STARTING,			///< pppd进程启动中
	MOBILE_PPP_CONNECTING,			///< 正在创建链接
	MOBILE_PPP_UP,					///< 链接已经建立
	MOBILE_PPP_CLOSE				///< 关闭PPP链接
} MobilePPPState;

/// PPP链接状态，64字节
typedef struct MobilePPPStatus 
{
	MobilePPPState state;			///< PPP链接状态
	int ipaddr;						///< PPP拨号后3G模块的IP地址
	int netmask;					///< PPP模块的IP地址掩码
	int gateway;					///< PPP模块的网关
	int reserved[12]; 				///< 保留字节，用于扩展
} MobilePPPStatus;

/// 3G模块的模式及信号强度，64字节
typedef struct MobileRSSI
{
	MobileType sys_mod;				///< 3G模块所处的模式
	int td_scdma;					///< 不同网络下的信号强度
	int wcdma;					
	int cdma_1x;					
	int edge;					
	int evdo;
	int rssi_valid;
	int rssi;						///< 信号强度					
	int reserved[8];
} MobileRSSI;

/// 读取/设置模块配置信息格式，512+64字节
typedef struct MobileConfig
{
	float version;					///< 配置文件版本号
	MobileModuleState state;		///< 模块状态
	MobilePPPConfig ppp_config;		///< ppp链接配置信息
	MobileType sys_mod;				///< 3G模块所处的网络模式	
	int reserved[13]; 				///< 保留字节，用于扩展
} MobileConfig;

/// 模块启动配置信息格式，64字节
typedef struct MobileStartConfig
{
	MobileModuleState state;		///< 模块启动状态，只能为POWER_ON
	int reserved[15]; 				///< 保留字节，用于扩展
} MobileStartConfig;

/// sim卡的iccid及运营商，128字节
typedef struct MobileSimInfo
{
	MobileSIMOperator carrier;		///< 运营商类型
	char iccid[64];					///< sim卡iccid号
	char net_status;				///< 网络状态 0：无法连接网络 1：允许连接网络
	char reserved1[3];				///< 保留字节
	int reserved[14]; 				///< 保留字节，用于扩展
} MobileSimInfo;

/// 3g模块的Imei号，128字节
typedef struct MobileModInfo
{
	char imei[64];					///< 模块imei号
	char version[32];				///< 模块版本号
	char calebration;				///< 校准参数 0：无 1：有
	char reserved1[3];				///< 保留字节
	int reserved[7]; 				///< 保留字节，用于扩展
} MobileModInfo;

/// 模块时间，28字节
typedef struct MobileModClock
{
    int sec;      ///< 秒  */
    int min;      ///< 分钟 */
    int hour;     ///< 时  */
    int day;      ///< 日  */
    int mon;      ///< 月  */
    int year;     ///< 年(后两位) */
    int timeZoom; ///< 时区
} MobileModClock;

/// wifi加密方式
typedef enum MobileEncMode
{
	NONE = 0,						///< 不加密
	WPA_PSK,						///< WPA-PSK
	WPA2_PSK,						///< WPA2-PSK
	MIXED,							///< WPA、WPA2混合
	WPAI_PSK,						///< WPAI-PSK
	WEP,							///< WEP
} MobileEncMode;

/// wifi加密算法
typedef enum MobileCipher
{
	AES = 0,						///< AES-CCMP
	TKIP,							///< WPA-TKIP
} MobileCipher;

/// 3g模块的wifi功能配置，128字节
typedef struct MobileWifiCfg
{
	char ssid[32];					///< wifi热点ssid
	char password[32];				///< wifi热点密码
	MobileEncMode auth_mode;		///< wifi加密方式
	MobileCipher cipher;			///< wifi加密算法
	int reserved[14]; 				///< 保留字节，用于扩展
} MobileWifiCfg;

/// 移动接口
typedef struct MobileInterface
{
	/// 底层私有数据
	void *priv;
	
	/// 该函数用来释放接口
	///
	/// \param [in] thiz 本接口指针
	/// \retval 0 成功
	/// \retval -1 失败
	int (*release)(struct MobileInterface *thiz);
	
	/// 该函数用来移动接口的默认配置
	///
	/// \param [in] thiz 本接口指针
	/// \param [out] pconfig  接口配置信息
	/// \retval 0 成功
	/// \retval <0 失败, 错误值见错误列表
	///        API_UNINIT CMD_SEND_FAIL CMD_RECV_FAIL
	///        INVAIL_REP INDEX_INVAIL FAIL_CREATE_CONFIG VERSION_INVAIL FAIL_OPEN_CONFIG
	int (*getConfig)(struct MobileInterface *thiz, MobileConfig *pconfig );
	
	/// 该函数用来修改移动接口的默认配置信息
	///
	/// \param [in] thiz 本接口指针
	/// \param [in] pconfig  接口配置信息
	/// \retval 0 成功
	/// \retval <0 失败, 错误值见错误列表
	///         API_UNINIT CMD_SEND_FAIL CMD_RECV_FAIL
	///         INVAIL_REP INDEX_INVAIL FAIL_CREATE_CONFIG PARAM_INAIL FAIL_OPEN_CONFIG SAVE_CONFIG_FAIL
	int (*setConfig)(struct MobileInterface *thiz, MobileConfig *pconfig);
	
	/// 该函数用来获取3G模块的状态信息
	///
	/// \param [in] thiz 本接口指针
	/// \param [out] pstate 接口状态
	/// \retval 0 成功
	/// \retval <0: 失败, 错误值见错误列表
	///         可能的错误值: 
	///         API_UNINIT CMD_SEND_FAIL CMD_RECV_FAIL CREATE_SOCK_FAIL FAIL_START
	///         INVAIL_REP INDEX_INVAIL PARAM_INAIL DEV_CLOSING 
	int (*getState)(struct MobileInterface *thiz, MobileModuleState *pstate);
	
	
	/// 该函数用来打开3G模块
	///
	/// \param [in] thiz 本接口指针
	/// \param [in] config 模块启动配置
	/// \retval 0 成功
	/// \retval <0: 失败, 错误值见错误列表
	///         可能的错误值: 
	/// 				API_UNINIT CMD_SEND_FAIL CMD_RECV_FAIL CREATE_SOCK_FAIL FAIL_START
	///   			INVAIL_REP INDEX_INVAIL PARAM_INAIL DEV_CLOSING     
	int (*openModule)(struct MobileInterface *mobileInterface, MobileStartConfig* config);
	
	/// 该函数用来关闭3G模块
	///
	/// \param [in] thiz 本接口指针
	/// \retval 0 成功
	/// \retval <0: 失败, 错误值见错误列表
	///         可能的错误值: 
	/// 				API_UNINIT CMD_SEND_FAIL CMD_RECV_FAIL
	///   			INVAIL_REP INDEX_INVAIL   
	int (*closeModule)(struct MobileInterface *mobileInterface);
	
	/// 该函数用来打开PPP链接
	///
	/// \param [in] thiz 本接口指针
	/// \param [in] config PPP配置信息
	/// \retval 0 成功
	/// \retval <0: 失败, 错误值见错误列表
	///         可能的错误值: 
	/// 				API_UNINIT CMD_SEND_FAIL CMD_RECV_FAIL
	///   			INVAIL_REP INDEX_INVAIL PPP_OPENED DEV_INITING PARAM_INAIL
	int (*openPPP)(struct MobileInterface *thiz, MobilePPPConfig *pconfig);
	
	/// 该函数用来关闭PPP链接
	///
	/// \param [in] thiz 本接口指针
	/// \retval 0 成功
	/// \retval <0: 失败, 错误值见错误列表
	///         可能的错误值: 
	/// 				API_UNINIT CMD_SEND_FAIL CMD_RECV_FAIL
	///   			INVAIL_REP INDEX_INVAIL
	int (*closePPP)(struct MobileInterface *thiz);
	
	/// 该函数用来获取一条短信
	///
	/// \param [in] thiz 本接口指针
	/// \param [out] sender 短信发送者号码
	/// \param [out] string 短信内容
	/// \retval 0 成功
	/// \retval <0: 失败, 错误值见错误列表
	///         可能的错误值: 
	/// 				API_UNINIT CMD_SEND_FAIL CMD_RECV_FAIL
	///   			INVAIL_REP INDEX_INVAIL RECV_SMS_EMPTY
	int (*getSMS)(struct MobileInterface *thiz, char* sender, char * pstring);
	
	/// 该函数用来发送一条短信
	///
	/// \param [in] thiz 本接口指针
	/// \param [in] receivers 短信接收者号码的数组指针
	/// \param [in] string 短信内容
	/// \retval 0 成功
	/// \retval <0: 失败, 错误值见错误列表
	///         可能的错误值: 
	/// 				API_UNINIT CMD_SEND_FAIL CMD_RECV_FAIL
	///   			INVAIL_REP INDEX_INVAIL CALLER_EMPTY
	int (*putSMS)(struct MobileInterface *thiz, char (*receivers)[NUMBER_LEN], char *string);
	
	/// 该函数用来获取一条来电
	///
	/// \param [in] thiz 本接口指针
	/// \param [out] caller 来电号码, 最大长度CALLER_LEN
	/// \param [in] handle 该呼叫句柄，以备后用，先需要返回0指针
	/// \retval 0 成功
	/// \retval <0: 失败, 错误值见错误列表
	///         可能的错误值: 
	/// 				API_UNINIT CMD_SEND_FAIL CMD_RECV_FAIL
	///   			INVAIL_REP INDEX_INVAIL CALLER_EMPTY   
	int (*getDialog)(struct MobileInterface *thiz, char* caller, void** handle);
	
	/// 该函数用来获取SIM卡状态信息
	///
	/// \param [in] thiz 本接口指针
	/// \param [out] pstate SIM卡状态
	/// \retval 0 成功
	/// \retval <0 失败, 错误值见错误列表
	///         可能的错误值: 
	/// 				API_UNINIT CMD_SEND_FAIL CMD_RECV_FAIL
	///   			INVAIL_REP INDEX_INVAIL  
	int (*getSIMState)(struct MobileInterface *thiz, MobileSIMState *pstate);
	
	/// 该函数用来获取PPP状态信息
	///
	/// \param [in] thiz 本接口指针
	/// \param [out] status PPP状态信息
	/// \retval 0 成功
	/// \retval <0 失败, 错误值见错误列表
	///         可能的错误值: 
	/// 				API_UNINIT CMD_SEND_FAIL CMD_RECV_FAIL
	///   			INVAIL_REP INDEX_INVAIL  
	int (*getPPPStatus)(struct MobileInterface *thiz, MobilePPPStatus *pstatus);
	
	/// 该函数用来获取模块信号强度
	///
	/// \param [in] thiz 本接口指针
	/// \param [out] rssi: 模块信号强度
	/// \retval 0 成功
	/// \retval <0: 失败, 错误值见错误列表
	///         可能的错误值: 
	/// 				API_UNINIT CMD_SEND_FAIL CMD_RECV_FAIL
	///   			INVAIL_REP INDEX_INVAIL  
	int (*getRSSI)(struct MobileInterface *thiz, MobileRSSI* prssi);
	
	/// 复位3G模块
	///
	/// \param [in] thiz 本接口指针
	/// \retval 0 成功
	/// \retval <0: 失败
	///         可能的错误值: 
	/// 				API_UNINIT CMD_SEND_FAIL CMD_RECV_FAIL
	///   			INVAIL_REP INDEX_INVAIL  	
	int (*reset)(struct MobileInterface *thiz);

	/// 修改3G模块模式
	///
	/// \param [in] thiz 本接口指针
	/// \retval 0 成功
	/// \retval <0: 失败
	///         可能的错误值: 
	/// 				API_UNINIT CMD_SEND_FAIL CMD_RECV_FAIL
	///   			INVAIL_REP INDEX_INVAIL PPP_OPENED 	
	int (*setMode)(struct MobileInterface *thiz, MobileType sys_mod);

	/// 设置调试信息输出等级
	///
	/// \param [in] thiz 本接口指针
	/// \param [in] level 打印级别，取值范围0~4
	/// \retval 0 成功
	/// \retval <0: 失败
	int (*setLogLevel)(struct MobileInterface *thiz, int level);

	/// 该函数用来获取SIM卡信息
	///
	/// \param [in] thiz 本接口指针
	/// \param [out] psiminfo SIM卡信息结构体
	/// \retval 0 成功
	/// \retval <0 失败, 错误值见错误列表
	///         可能的错误值: 
	int (*getSIMInfo)(struct MobileInterface *thiz, MobileSimInfo *psiminfo);

	/// 该函数用来获取模块信息
	///
	/// \param [in] thiz 本接口指针
	/// \param [out] pmodinfo 模块信息结构体
	/// \retval 0 成功
	/// \retval <0 失败, 错误值见错误列表
	///         可能的错误值: 
	int (*getModuleInfo)(struct MobileInterface *thiz, MobileModInfo *pmodinfo);
	
	/// 该函数用来获取拨号失败原因
	///
	/// \param [in] thiz 本接口指针
	/// \param [out] reason 拨号失败原因
	/// \retval 0 成功
	/// \retval <0 失败, 错误值见错误列表
	///         可能的错误值: 
	int (*getReason)(struct MobileInterface *thiz, char reason[128]);
	
	/// 该函数用来获取是否支持wifi
	///
	/// \param [in] thiz 本接口指针
	/// \param [out] psupport 是否支持wifi 0：不支持 1：支持
	/// \retval 0 成功
	/// \retval <0 失败, 错误值见错误列表
	///         可能的错误值: 
	int (*getWifiSupport)(struct MobileInterface *thiz, int *psupport);
	
	/// 该函数用来wifi热点开关
	///
	/// \param [in] thiz 本接口指针
	/// \param [out] enable wifi热点开关 0：关闭 1：开启
	/// \retval 0 成功
	/// \retval <0 失败, 错误值见错误列表
	///         可能的错误值: 
	int (*setWifiApOn)(struct MobileInterface *thiz, int enable);
	
	/// 该函数用来wifi热点配置
	///
	/// \param [in] thiz 本接口指针
	/// \param [out] pconfig wifi热点配置
	/// \retval 0 成功
	/// \retval <0 失败, 错误值见错误列表
	///         可能的错误值: 
	int (*setWifiAp)(struct MobileInterface *thiz, MobileWifiCfg *pconfig);

	/// 该函数用来获取模块时间
	///
	/// \param [in] thiz 本接口指针
	/// \param [out] pClock 模块时间结构体
	/// \retval 0 成功
	/// \retval <0 失败, 错误值见错误列表
	///         可能的错误值: 
	int (*getModuleClock)(struct MobileInterface *thiz, MobileModClock *pClock);

    /// 该函数用来获取模块诊断错误和精简日志
    ///
    /// \param [in] thiz 本接口指针
    /// \param [out] pLog 日志信息
    /// \param [in/out] pLen 输入时为缓存长度，输出时为有效日志信息长度
    /// \retval >=0 错误码
    /// \retval <0 失败, 
    int (*getErrorLog)(struct MobileInterface *thiz, char *pLog, int *pLen);


	/// 保留字节
	void* reserved[102];
} MobileInterface;

//
//				           函数申明
//
/// 该函数用来初始化3G接口库资源或重建3G程序与3G接口库的链接
///
/// \retval 0: 成功 
/// \retval -1: 失败
int PAL_API initMobileLib(void);

/// 该函数用来获取移动接口信息
/// \param [in] list 指向移动接口信息结构MobileInterfaceInfo的数组
/// \param [in] num list数组的大小
/// \param [out] num 获取的接口数
/// \retval 0 成功
/// \retval <0: 失败, 错误值见错误列表
///         可能的错误值: 
/// 				API_UNINIT CMD_SEND_FAIL CMD_RECV_FAIL
///   			INVAIL_REP INDEX_INVAIL 
int PAL_API getMobileInterfaceList(MobileInterfaceInfo* list, int *num);

/// 该函数用来创建移动接口
/// \param [in] desc: 移动接口描述结构MobileInterfaceDesc指针
/// \param [out] mobileInterface: 网络指针的指针
/// \retval 0 成功
/// \retval -1: 失败
int PAL_API createMobileInterface(MobileInterfaceInfo *desc, MobileInterface **mobileInterface);

/// 该函数用来设置Mobile库调试级别
/// \param [in] level: 级别，取值范围0~4
/// \retval 0 成功
/// \retval -1: 失败
int PAL_API setMobileLibLog(int level);

/// @} end of group

#ifdef __cplusplus
}
#endif

#endif //__MOBILE_API_H__
